package com.example.demo.Controller;

import com.example.demo.model.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

@Slf4j
@Controller
@RequestMapping("/user")  // 类上面的RequestMapping是一级目录，类上的RequestMapping其实是可以省略的
@ResponseBody  // 返回的是非静态页面数据
public class UserController {

    @RequestMapping("/sayhi")  // 方法上的RequestMapping一定不能省略！！（除非不想将该方法暴露）
    public String sayHi(HttpServletRequest request) {
        return "Hi, Babe."  + " | " + request.getParameter("name") ;
    }

    @RequestMapping(method = RequestMethod.POST,value = "sayye")
    public String sayYe() {
        return "Ye,牌不错耶";
    }

    // 只支持post请求
    @PostMapping("/saygood")
    public String sayGood() {
        return "do a good job!";
    }

    // 只支持get请求
    @GetMapping("/sayhey")
    public String sayHey() {
        return "hey, brother.";
    }

    // 传入单个参数获取对象
    @RequestMapping("/getuserbyid")
    public UserInfo getUserById(Integer id) { // 参数强烈建议使用包装类！
        // 这里使用伪代码
        // 不查询数据库，直接返回用户对象
        UserInfo userInfo = new UserInfo();
        userInfo.setId(id==null? 0 : id);
        userInfo.setName("小周");
        userInfo.setPassword("123yeye");
        userInfo.setAge(18);
        return userInfo;
    }

    // 获取多个参数
    @RequestMapping("/login")
    public String login(String userName, String password) {
        return "用户名: " + userName + " | 密码： " +password;
    }

    // 获取对象
    @RequestMapping("/reg")
    public String register(@RequestBody UserInfo userInfo) {
        return "用户信息： " + userInfo;
    }

    // 表单参数
    @RequestMapping("/form")
    public Object form(String name, String psw) {
        System.out.println("name参数： " + name);
        System.out.println("psw参数： " + psw);
        return "/index.html";
    }

    // 实现参数重命名
    @RequestMapping("/log")
    public String log(@RequestParam(value = "name", required = false) String userName, String password) {
        return "用户名: " + userName + " | 密码： " +password;
    }

    // @RequestBody接收JSON对象

    // 获取URL地址中参数@PathVariable
    @RequestMapping("/hero/{id}/{hero}")
    public String getHeroInfo(@PathVariable Integer id, @PathVariable String hero) {
        return "ID: " + id + " | HERO: " + hero;
    }

    // 上传文件@RequestPart
    @RequestMapping("upimg")
    public boolean upImg(Integer id, @RequestPart("img")MultipartFile file) {
        boolean ret = false;
        // 上传文件到本地目录（本地：指的是服务器）

        // 获取原上传图片的格式
        // 图片名称.图片格式
        String fileName = file.getOriginalFilename(); // 获取到原图片的名称
        fileName = fileName.substring(fileName.lastIndexOf(".")); // 得到图片后缀
        fileName = UUID.randomUUID().toString() + fileName; // 进行拼接：新图片名称+原图片后缀

        try {
            // 新的路径：目录/保存路径imgPath + 新的文件名.格式
            file.transferTo(new File(imgPath + fileName));
            ret = true;
        } catch (IOException e) {
            // 注意加上注释@Slf4j
            log.error("上传图片失败： " + e.getMessage());
        }
        return ret;
    }

    // 从配置文件中读取图片的保存路径
    // 注意value所在的包！！是springframework
    @Value("${img.path}")
    private String imgPath;

    @RequestMapping("/path")
    public String path() {
        return "Path: " + imgPath;
    }

    // ①Servlet获取Cookie的方法：
    @RequestMapping("/cookie")
    public void getCookie(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        // 直接使用for-each进行打印
        for (Cookie cookie : cookies) {
            log.info("Cookie Name: " + cookie.getName() +
                    " | Cookie Value: " + cookie.getValue());
        }
    }

    // ②使用@CookieValue的注解实现Cookie的读取
    @RequestMapping("/cookie2")
    public String getCookie2(@CookieValue("come") String cookie) { // 按key来获取
        return "Cookie Name: " + cookie;
    }

    // Servlet获取header
    @GetMapping("/getcn")
    public String getHeader(HttpServletRequest request) {
        return "header: " + request.getHeader("Connection");
    }

    // ②使用@RequestHeader注解获取header
    // 参数是key
    @RequestMapping("/getheader")
    public String getHeader2(@RequestHeader("User-Agent")String userAgent,
                             @RequestHeader("Connection")String con) {
        return "uerAgent: " + userAgent + " | connection: " + con;
    }

    // 存储session
    @RequestMapping("/setss")
    public boolean setSession(HttpServletRequest request) {
        boolean ret = false;
        // 1. 先得到HttpSession对象
        HttpSession session = request.getSession(true); // true：没有会话就新建会话
        // 2. 使用setAttribute设置值
        session.setAttribute("userinfo","小周");
        ret = true;
        return ret;
    }

    // 获取session
    @RequestMapping("/getss")
    public String getSession(HttpServletRequest request) {
        String ret = null;
        // 1. 先得到HttpSession对象
        HttpSession session = request.getSession(false); // false:有会话就使用，没有不创建
        // 2. getAttribute得到session信息
        // 进行判断
        if(session!=null && session.getAttribute("userinfo")!=null) {
            ret = (String) session.getAttribute("userinfo");
        }
        return ret;
    }

    // 使用@SessionAttribute注解获取session
    @RequestMapping("/getss2")
    // 注意：指定是非必须参数；如果不指定，默认是必须参数，没有就会报错！
    public String getSession(@SessionAttribute(value = "userinfo",
            required = false) String userinfo) {
        return "会话： " + userinfo;
    }

}
